home *** CD-ROM | disk | FTP | other *** search
- #!/bin/sh
- # @(#) readinfo 1.3 92/08/31 @(#)
- # reads a host database file
- #
- # input from stdin
- # output to stdout
- #
- # arguments are names of fields in the file
- #
- # fields in a file are defined by a comment line of the form
- # #FIELDS <field_description> ...
- #
- # where <field_description> is the name of the field followed by optional
- # keyword parameters of the form parameter=<value>
- # three paramaters are supported in this script
- # prefix - prefix added to value of the field
- # suffix - suffix added to value of field
- # no - character to prevent adding a prefix or suffix to a field
- #
- # fields in the file are separated with white space. Embedded blanks in fields
- # are either escaped with a '\' or the entire field is quoted with double quotes
- # The prefix or suffix can be overridden by prepending or following the value
- # with the ``no='' character
-
- # Copyright (c) 1992 by Texas Internet Consulting
- # This code may be freely copied and used so long as this
- # copyright notice is attached. This code may not be sold
- # without the express written permission of Texas Internet Consulting.
- # Texas Internet Consulting makes no warranty as to the correctness
- # nor the applicability of this code for any purpose.
-
- # get the fields from the command line - will be funnelled to awk
- fields="$*"
- # change whitespace to tabs and handle quoted fields and escaped blanks
- # also remove comment lines, except the #FIELDS line
- awk '
- BEGIN {
- # get around double quote bug
- dq = sprintf("%c", 34)
- }
- /^#FIELDS/ || ( ! /^#/ && ! /^$/ && ! /^[ ][ ]*/ ) {
- # line has double quotes or backslashes
- if ($0 ~ /"/ || $0 ~ /\\/) {
- # print everything up to field with double quote or backslash
- l = length($0)
- n = 0
- for (i=1; i<=NF; i++) {
- if ($i !~ /"/ && $i !~ /\\/) {
- printf("%s\t", $i)
- }
- n += length($i)
- n++
- }
- remainder = substr($0, n+1, l-n)
- l -= n
- quoted = 0
- escaped = 0
- for (i=1; i<=l; i++) {
- sub = substr(remainder, i, 1)
- if (sub == dq) {
- if (quoted) {
- quoted = 0
- }
- else {
- quoted = 1
- }
- }
- else if (sub == "\\") {
- escaped = 1
- }
- else if (quoted) {
- printf("%s", sub)
- }
- else if (escaped) {
- printf("%s", sub)
- escaped = 0
- }
- else if (sub == " ") {
- printf("\t")
- }
- else {
- printf("%s", sub)
- }
- }
- }
- # line is just a bunch of normal fields
- else {
- for (i=1; i<=NF; i++) {
- printf("%s", $i)
- if (i < NF) {
- printf("\t")
- }
- }
- }
- printf("\n")
- }' |
- # read file and output fields wanted
- awk -F' ' '
- # get the fields from the command line
- BEGIN {
- EXTRACT="'"$fields"'"
- nextract = split(EXTRACT, extract, " ")
- }
- # extract field definition info from file
- /^#FIELDS/ {
- nfields = 0
- for (i=2; i<=NF; i++) {
- # field is a paramter
- if ($i ~ /\=/) {
- n = split($i, part, "=")
- keyword = part[1]
- value = part[2]
- # prefix
- if (keyword == "prefix") {
- prefix[nfields] = value
- }
- # suffix
- else if (keyword == "suffix") {
- suffix[nfields] = value
- }
- else if (keyword == "no") {
- no[nfields] = value
- }
- }
- #field name
- else {
- nfields++
- fields[nfields] = $i
- prefix[nfields] = ""
- suffix[nfields] = ""
- no[nfields] = ""
- }
- }
- }
- # process a record
- ! /^#/ && ! /^$/ && ! /^[ ][ ]*/ {
- # scan the list of fields to extract and compare them with the
- # list in the file and print as they are encountered
- for (i=1; i<=nextract; i++) {
- for (j=1; j<=nfields; j++) {
- if (fields[j] == extract[i]) {
- break
- }
- }
- if (j > nfields) {
- printf("***ERROR*** field not found - %s\n", extract[i])
- continue
- }
- if (i > 1) printf(" ")
- # no overide character for this field
- if (no[j] == "") {
- printf("%s%s%s", prefix[j], $j, suffix[j])
- continue
- }
- # overide character exist - split up the field
- n = length($j)
- first = substr($j, 1, 1)
- last = substr($j, n, 1)
- # no overide character in field value
- if (first != no[j] && last != no[j]) {
- printf("%s%s%s", prefix[j], $j, suffix[j])
- continue
- }
- middle = ""
- if (n >= 3) {
- middle = substr($j, 2, n-2)
- }
- if (first != no[j]) {
- printf("%s%s", prefix[j], first)
- }
- printf("%s", middle)
- if (last != no[j]) {
- printf("%s%s", last, suffix[j])
- }
- }
- printf("\n")
- }'
-